package cn.mesmile.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * callable实现新建线程的步骤：
 * 1.创建一个实现callable的实现类
 * 2.实现call方法，将此线程需要执行的操作声明在call（）中
 * 3.创建callable实现类的对象
 * 4.将callable接口实现类的对象作为传递到FutureTask的构造器中，创建FutureTask的对象
 * 5.将FutureTask的对象作为参数传递到Thread类的构造器中，创建Thread对象，并调用start方法启动（通过FutureTask的对象调用方法get获取线程中的call的返回值）
 */
public class ThreadCallable {

    private static int sum = 0;

    public static void main(String[] args) {
        // 就一个线程，非多线程
        // ①、实现callable接口，覆写 call 方法
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                for (int i = 0; i <= 100; i++) {
                    Thread.sleep(100);
                    if (i % 2 == 0) {
                        System.out.println(Thread.currentThread().getName() + "----> :" + i);
                        sum += i;
                    }
                }
                return sum;
            }
        };
        // ②、将 callable 实现类对象传递到 FutureTask 构造器中
        FutureTask<Integer> integerFutureTask = new FutureTask<>(callable);
        // ③、将 FutureTask 传递到 Thread 的构造器中
        Thread thread = new Thread(integerFutureTask);

        thread.setName("线程123");
        thread.start();

        System.out.println("------------------------------------------------------");
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>  线程未执行完成，先执行后面的代码");
        System.out.println("------------------------------------------------------");

        try {
            // 获取返回值
            System.out.println("integerFutureTask.get() = " + integerFutureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
